/*
 * Config.cpp
 *
 *  Created on: Jan 28, 2010
 *      Author: jgrande
 */

#include "Config.h"

using std::string;

using namespace framework::io;

using middleware::common::Direccion;
using middleware::common::DireccionTCP;

Config::Config() {
	logger << "Cargando configuración desde archivo " << CONFIG_FILENAME << logger.endl;
	Utiles::load_config(CONFIG_FILENAME, config);
	Utiles::load_config(HOSTS_FILENAME, hosts);
	loadDirLocal();
}

void Config::loadDirLocal() {
	if(getenv("HOSTNAME")==NULL) {
		logger << LogType::LOG_ERROR << "falta cargar la variable de entorno HOSTNAME" << logger.endl;
		return;
	}

	string localhost = string(getenv("HOSTNAME"));

	config_t::iterator it;
	for(it=hosts.begin();it!=hosts.end();it++) {
		if(it->second.find(localhost+":")==0) {
			dirLocal = Utiles::fromString<Direccion>(it->first);
			logger << "La dirección local es " << dirLocal << logger.endl;
			return;
		}
	}

	logger << LogType::LOG_ERROR << "Error! Imposible obtener la dirección local" << logger.endl;
}

DireccionTCP Config::getHost(Direccion mwdir) {
	DireccionTCP dirTCP;

	dirTCP.host = "localhost";
	dirTCP.port = 0;

	if(hosts.count(Utiles::toString(mwdir))==0) {
		logger << LogType::LOG_ERROR << "Error! No se encontró el host con dirección " << mwdir << logger.endl;
		return dirTCP;
	}

	string hostname = hosts[Utiles::toString(mwdir)];
	string::size_type possep = hostname.find(':');

	if(possep==string::npos) {
		logger << LogType::LOG_ERROR << "Sintaxis inválida para la dirección "
				<< mwdir << ", falta número de puerto" << logger.endl;
		return dirTCP;
	}

	dirTCP.host = hostname.substr(0, possep);
	dirTCP.port = Utiles::fromString<int>(hostname.substr(possep+1));

	Utiles::chop(dirTCP.host);

	logger << "Dirección " << mwdir << " traducida a host " <<
			dirTCP.host << " en puerto " << dirTCP.port << logger.endl;

	return dirTCP;
}
